package whitelist

import (
	"log"
	"net"
	"net/url"
	"regexp"
	"strings"
	"thais/utils"
)

var parseURL = url.Parse

func Match(list []string, url string) bool {
	u, _ := parseURL(url)
	flag := false
	for _, k := range list {
		if match(u.Host, k) {
			flag = true
			break
		}
	}
	return flag
}

func match(host, reg string) bool {
	log.Println("<---- Host In:", host, reg)
	if reg == "*" {
		return true
	}
	if strings.Contains(reg, "-->") { // 判断ip范围
		ips := strings.Split(reg, "-->")
		if len(ips) != 2 {
			return false
		}
		ipa := strings.TrimSpace(ips[0])
		ipb := strings.TrimSpace(ips[1])
		var (
			ipai, ipbi, hosti int64
		)
		if strings.Contains(ipa, ":") {
			ipai = utils.IP6toInt(net.ParseIP(ipa))
			ipbi = utils.IP6toInt(net.ParseIP(ipb))
			hosti = utils.IP6toInt(net.ParseIP(host))
		} else {
			ipai = utils.IP4toInt(net.ParseIP(ipa))
			ipbi = utils.IP4toInt(net.ParseIP(ipb))
			hosti = utils.IP4toInt(net.ParseIP(host))
		}
		return hosti >= ipai && hosti <= ipbi
	}
	r, err := regexp.Compile(`^` + reg + `$`) // 通配符规则
	if err != nil {
		r, err = regexp.Compile(reg) // 直接规则
		if err != nil {
			return false
		}
		return r.MatchString(host)
	}
	return r.MatchString(host)
}

/*
* 需求
*
白名单 * ? 正则 ip段 const
[
	"www.taobao.com",
	"*.baidu.com",
	"www.cnki.net.cn",
	"*.*.net.cn",
	"((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))"
]
*/
